/*
背景
此“暗算”非彼《暗算》; -) ，虽然我们没有电影中阿柄惊人的听力，可以辨别破译密码，但是我们也可以成为破译专家。

现在就来给大家作一个集训：

改变阿拉伯字母的顺序是文本加密中十分常用的方法，但是并不安全。也就是说，把文本中的每一个阿拉伯字母都要一致地替换成一些其他的字母。为了保证加密的可逆性，需要每个阿拉伯字母都有唯一一个替换的字母（也就说，任意两个阿拉伯字母都不可以用同一个字母来替换）。

最有效的密码分析方法就是“已知明文攻击（known - plaintext attack）”法。在此种方法中，密钥专家掌握着敌方加密的短语或语句，然后通过观察这些加密文字从而推导出译码的方法。

你现在的任务就是来破译几行加密的文本，这些文本是用一条密钥加密的，即某一行加密前就是密钥本身。密钥是一个包含了全部 26 个英文字母的字符串，譬如在“暗算 1.0”中，使用的密钥是：

the quick brown fox jumps over the lazy dog
不过一个固定的密钥实在是太容易破译了，只要掌握了规律，就不太费劲。为了能够保证信息的安全性，我们决定在此次集训中，使用可变化的密钥。也就是说，每一组测试用例，都包含着自己的密钥。

输入
首先是单独一个正整数用来说明测试的组数，后边跟着一行字符串，这行字符串就是这次测试用例所使用的密钥。再接着是一个空白行。而且，连续两组测试之间也有一个空白行。

每组测试有多行输入组成。加密的方式如上所示。加密的文本行只包含有小写字母和空格，而且长度不超过 200 个字符。最多有 100 条输入的文本行。

输出
对应每组测试, 解密每一行的信息，并且把标准输出打印出来。如果有多于一种的解密方法，那么任何一种都可以。如果没有解密的方法，则输出信息“No solution.”

每两组测试输出之间必须用一个空白行分隔开。

来源
http ://online-judge.uva.es/p/v8/850.html
*/

#ifdef _MSC_VER
#define _CRT_SECURE_NO_WARNINGS
#endif
#if defined(_WIN32) && !defined(__cplusplus)
#define inline __inline
#endif

#include <stdio.h>
#include <memory.h>
#include <string.h>

#define MAX_INPUT_LENGTH 205
#define MAX_TABLE_LENGTH 27
typedef int		BOOL;
#define TRUE	1
#define FALSE	0


static inline BOOL CheckKey(const char *key, const char *str, char table[MAX_TABLE_LENGTH])
{
	int len = strlen(key);
	if (strlen(key) != strlen(str)) return FALSE;

	memset(table, 0, sizeof(char) * MAX_TABLE_LENGTH);
	for (int i = 0; i < len; i++)
	{
		if (key[i] == ' ' || str[i] == ' ')
		{
			if (key[i] != str[i])return FALSE;
			else continue;
		}
		int keyIndex = key[i] - 97;
		if (table[keyIndex] == 0) table[keyIndex] = str[i];
		else if (table[keyIndex] != str[i]) return FALSE;
	}

	memset(table, 0, sizeof(char) * MAX_TABLE_LENGTH);
	for (int i = 0; i < len; i++)
	{
		if (key[i] == ' ' || str[i] == ' ')
		{
			if (key[i] != str[i])return FALSE;
			else continue;
		}
		int keyIndex = str[i] - 97;
		if (table[keyIndex] == 0) table[keyIndex] = key[i];
		else if (table[keyIndex] != key[i]) return FALSE;
	}
	return TRUE;
}

static inline char * ReadLine(char* _Buffer, int _MaxCount)
{
	char *line = fgets(_Buffer, _MaxCount, stdin);
	if (line != NULL)
	{
		int end = strlen(line) - 1;
		if (line[end] == '\n') line[end] = '\0';
	}
	return line;
}

int main()
{
	int n;
	scanf("%d", &n);
	getchar();
	char key[MAX_INPUT_LENGTH];
	ReadLine(key, MAX_INPUT_LENGTH);
	getchar();

	char input[105][MAX_INPUT_LENGTH];
	for (int z = 0; z < n; z++)
	{
		// memset(input, 0, sizeof(input));
		char table[MAX_TABLE_LENGTH] = {0};
		BOOL findTable = FALSE;

		int sentenceNum = 0;
		while (1)
		{
			if (ReadLine(input[sentenceNum], MAX_INPUT_LENGTH) == NULL) break;
			if (input[sentenceNum][0] == 0) break;
			if (!findTable) findTable = CheckKey(key, input[sentenceNum], table);
			++sentenceNum;
		}

		if (!findTable)
		{
			printf("No solution.\n");
			goto end;
		}

		for (int i = 0; i < sentenceNum; i++)
		{
			int len = strlen(input[i]);
			for (int j = 0; j < len; j++)
			{
				if (input[i][j] == ' ') printf(" ");
				else
				{
					int keyIndex = input[i][j] - 97;
					printf("%c", table[keyIndex]);
				}
			}
			printf("\n");
		}
	end:
		if (z != n - 1) printf("\n");
	}

	return 0;
}